package main

import "fmt"

/*
数组切片就像一个指向数组的指针，实际上它拥有自己的数据结构，而不仅仅是
个指针。数组切片的数据结构可以抽象为以下3个变量：
 一个指向原生数组的指针；
 数组切片中的元素个数；
 数组切片已分配的存储空间。
*/
func main(){

	var myArray[5] int =[5]int {1,2,3,4,5}
	//根据数组创建且切片
	var mySlice[] int =myArray[:2]  //myArray[first:last]
	fmt.Println("Elments of myArray:")
	for _,v:=range myArray{
		fmt.Print(v," ")

	}
	fmt.Println("\nElements of mySlice:")
	for _,v:=range mySlice{
		fmt.Print(v," ")
	}

	mySlice1 :=make([]int ,5)//初始元素个数为5的数组切片，元素初始值为0
	mySlice2:=make([]int ,5,10)//初始元素个数为5的数组切片，元素初始值为0，并预留10个元素的存储空间
	//mySlice3:=[]int {1,2,3,4,5}//直接创建并初始化包含5个元素的数组切片

	//事实上还会有一个匿名数组被创建出来，只是不需要我们来操心而已。
	fmt.Println("len(mySlice1):", len(mySlice1)) //长度
	fmt.Println("cap(mySlice1):", cap(mySlice1)) //容量

	mySlice = append(mySlice, 1, 2, 3) //追加三个元素

	mySlice = append(mySlice, mySlice2...) //追加切片 需要增加... 不然编译会报错

	oldSlice := []int{1, 2, 3, 4, 5}
	newSlice := oldSlice[:3] // 基于oldSlice的前3个元素构建新数组切片
	fmt.Println(newSlice)

	slice1:=[] int {1,2,3,4,5}
	slice2:=[] int {3,4,5}
	copy(slice2,slice1) //只会复制slice1的前三个元素到slice2中
	copy(slice1,slice2) //只会复制slice2的3个元素到slice1的前3个位置
}